#include "spi.h"

/********************************
*函数名称：SPI3_Configuration
*函数功能：用于初始化SPI3
*输入参数：none
*输出参数：none
***********************************/
void SPI3_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	SPI_InitTypeDef SPI_InitStructure;	
	//SPI3先设置到默认值
	SPI_I2S_DeInit(SPI3);
	//SPI3默认为关闭
	SPI_Cmd(SPI3, DISABLE);
	//AFIO的RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//GPIO的RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//SPI3的RCC
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);	
	//SPI3与JTAG调试口复用 所以必须关闭JTAG功能才能使用SPI3 的功能/*重点 *这一段只能放在这里*/
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);	
	//IO输入输出配置 及初始IO电平
	GPIO_InitStructure.GPIO_Pin = SPI3_CS | SPI3_SCK | SPI3_MISO | SPI3_MOSI;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(SPI3_GPIO, &GPIO_InitStructure);
	//SPI3功能设置
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;	        //单工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;                      	//从机模式
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                 	//数据位为8
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                       	//不发送数据时，时钟线为高
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                      	//在第二个沿进行采样
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                         	//软件NSS
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;	// 36M/2=18M
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                	//MSB优先
	SPI_InitStructure.SPI_CRCPolynomial = 7;
	SPI_Init(SPI3, &SPI_InitStructure);
	//根据cs脚的控制对cs脚进行二次设置 
	GPIO_InitStructure.GPIO_Pin		=	SPI3_CS;
	GPIO_InitStructure.GPIO_Speed 	= 	GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode 	= 	GPIO_Mode_Out_PP;
	GPIO_Init(SPI3_GPIO,&GPIO_InitStructure);
	//设置IO口初始化电平 为高电平
	//cs为高电平
	GPIO_SetBits(SPI3_GPIO,SPI3_CS);
	//miso mosi sck为低电平	
	//GPIO_ResetBits(SPI3_GPIO,SPI3_SCK | SPI3_MISO | SPI3_MOSI);
	//使用DMA功能
	SPI_I2S_DMACmd(SPI3,SPI_I2S_DMAReq_Rx,ENABLE);
	//清标识
	SPI_I2S_ClearFlag(SPI3,SPI_I2S_FLAG_RXNE);
	SPI_I2S_ClearFlag(SPI3,SPI_I2S_FLAG_TXE);
	SPI_I2S_ClearITPendingBit(SPI3, SPI_I2S_IT_RXNE);
	//SPI3默认为关闭
	SPI_Cmd(SPI3, DISABLE);                                      
}


/***************************************
*函数名称：SPI2_Configuration
*函数功能：SPI2配置
*输入参数：none
*输出参数：none
****************************************/
void SPI2_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	SPI_InitTypeDef SPI_InitStructure; 
	//SPI2 恢复默认值
	SPI_I2S_DeInit(SPI2);
	//SPI2默认为关闭
	SPI_Cmd(SPI2,DISABLE);	
	//AFIO的RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//GPIO的RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//SPI2的RCC
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);	
	//IO输入输出配置 及初始IO电平
	GPIO_InitStructure.GPIO_Pin = SPI2_CS | SPI2_SCK | SPI2_MISO | SPI2_MOSI;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(SPI2_GPIO, &GPIO_InitStructure);
	//SPI2功能设置
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;	//全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                      	//SPI2为主机模式  读写PRAM数据
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                 	//数据位为8
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                       	//
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                      	//在第一个沿进行采样
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                         	//软件NSS
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;	// 36M/2=18M
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                	//MSB优先
	SPI_InitStructure.SPI_CRCPolynomial = 7;
	SPI_Init(SPI2, &SPI_InitStructure);
	//根据cs脚的控制对cs脚进行二次设置 
	GPIO_InitStructure.GPIO_Pin		=	SPI2_CS;
	GPIO_InitStructure.GPIO_Speed 	= 	GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode 	= 	GPIO_Mode_Out_PP;
	GPIO_Init(SPI2_GPIO,&GPIO_InitStructure);
	//cs为高电平
	GPIO_SetBits(SPI2_GPIO,SPI2_CS);
	//miso mosi sck为低电平	
	//GPIO_ResetBits(SPI2_GPIO,SPI2_SCK | SPI2_MISO | SPI2_MOSI);
	//SPI2发送使用DMA功能
	SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
	//清标识
	SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_RXNE);
	SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_TXE);
	SPI_I2S_ClearITPendingBit(SPI2, SPI_I2S_IT_RXNE);
	//SPI2默认为关闭
	SPI_Cmd(SPI2, DISABLE);		
}


/**************************
*函数名称：SPI2_IRQHandler
*函数功能：SPI2中断向量入口
*
*
*****************************/
void SPI2_IRQHandler(void)
{
}


/**************************
*函数名称：SPI3_IRQHandler
*函数功能：SPI3中断向量入口
*
*
*****************************/
void SPI3_IRQHandler(void)
{
    if(SPI_I2S_GetITStatus(SPI3,SPI_I2S_FLAG_RXNE) != RESET)
	{
		SPI_I2S_ClearFlag(SPI3,SPI_I2S_FLAG_RXNE);	
	}
}

